package com.lanvideo.service;

import com.lanvideo.dao.UserDao;
import com.lanvideo.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 * 用户服务层
 */
@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    /**
     * 用户登录
     */
    public User login(String username, String password) {
        User user = userDao.findByUsername(username);
        if (user != null && user.getPassword().equals(md5(password))) {
            // 检查用户状态
            if (user.getStatus() == null || user.getStatus() == 0) {
                // 用户被禁用
                return null;
            }
            return user;
        }
        return null;
    }

    /**
     * 用户注册
     */
    public boolean register(User user) {
        // 检查用户名是否已存在
        if (userDao.existsByUsername(user.getUsername())) {
            return false;
        }
        
        // 密码加密
        user.setPassword(md5(user.getPassword()));
        
        // 保存用户
        return userDao.save(user) > 0;
    }

    /**
     * 更新用户信息
     */
    public boolean updateUser(User user) {
        // 如果密码不为空，则加密
        if (user.getPassword() != null && !user.getPassword().isEmpty()) {
            user.setPassword(md5(user.getPassword()));
        }
        return userDao.update(user) > 0;
    }

    /**
     * 根据ID获取用户
     */
    public User getUserById(Integer id) {
        return userDao.findById(id);
    }

    /**
     * 根据用户名获取用户
     */
    public User getUserByUsername(String username) {
        return userDao.findByUsername(username);
    }

    /**
     * 获取所有用户
     */
    public List<User> getAllUsers() {
        return userDao.findAll();
    }

    /**
     * 根据角色获取用户列表
     */
    public List<User> getUsersByRole(Integer role) {
        return userDao.findByRole(role);
    }

    /**
     * MD5加密
     */
    private String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageDigest = md.digest(input.getBytes());
            StringBuilder hexString = new StringBuilder();
            
            for (byte b : messageDigest) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5加密失败", e);
        }
    }


    /**
     * 创建用户（管理员功能）
     */
    public boolean createUser(User user) {
        // 检查用户名是否已存在
        if (userDao.findByName(user.getName()) != null) {
            return false;
        }
        
        // 检查邮箱是否已存在
        if (userDao.findByEmail(user.getEmail()) != null) {
            return false;
        }
        
        // 加密密码
        user.setPassword(md5(user.getPassword()));
        
        return userDao.createUser(user) > 0;
    }


    /**
     * 删除用户（管理员功能）
     */
    public boolean deleteUser(Integer userId) {
        return userDao.deleteUser(userId) > 0;
    }

    /**
     * 重置用户密码（管理员功能）
     */
    public boolean resetPassword(Integer userId, String newPassword) {
        String hashedPassword = md5(newPassword);
        return userDao.updatePassword(userId, hashedPassword) > 0;
    }

    /**
     * 哈希密码
     */
    public String hashPassword(String password) {
        return md5(password);
    }

    /**
     * 验证密码
     */
    public boolean verifyPassword(String plainPassword, String hashedPassword) {
        return md5(plainPassword).equals(hashedPassword);
    }

    /**
     * 更新用户密码（不进行二次哈希）
     */
    public boolean updateUserPassword(Integer userId, String hashedPassword) {
        return userDao.updatePassword(userId, hashedPassword) > 0;
    }

    /**
     * 更新用户状态
     */
    public boolean updateUserStatus(Integer userId, Integer status) {
        return userDao.updateUserStatus(userId, status) > 0;
    }

    /**
     * 更新用户信息（不包含密码）
     */
    public boolean updateUserInfo(User user) {
        return userDao.updateUserInfo(user) > 0;
    }

    /**
     * 更新用户最后登录时间
     */
    public boolean updateLastLoginTime(Integer userId) {
        return userDao.updateLastLoginTime(userId) > 0;
    }
}
